///////////////////////////////////////////////////////////////////////////////////////////////////
/// \file formic/fqmc/onepdm.h
///
/// \brief   header file for the monte carlo one particle rdm functions
///
///////////////////////////////////////////////////////////////////////////////////////////////////

#ifndef FORMIC_FQMC_ONEPDM_HEADER
#define FORMIC_FQMC_ONEPDM_HEADER

#include<vector>
#include<string>

#include<formic/random/random.h>

#include<boost/shared_ptr.hpp>

namespace formic {

  class InputBase;
  class Configuration;
  class Archive;
  class AllData;
  template<class S> class CoeffObj;

  namespace fqmc {

    template<class S> class Sampler;

    template<class S> void get_nos(const formic::InputBase & userinp,
                                   boost::shared_ptr<formic::fqmc::Sampler<S> > & sampler,
                                   const boost::shared_ptr<formic::CoeffObj<S> > & vf,
                                   std::vector<double> & anocc,
                                   std::vector<double> & bnocc,
                                   std::vector<S> & ano,
                                   std::vector<S> & bno);

    template<class S> void nat_orb_text_print(const int n, 
                                              const std::string & name,
                                              const std::vector<double> & occs,
                                              const std::vector<S> & orbs);

    template<class S> void print_nos(const formic::InputBase & userinp,
                                     boost::shared_ptr<formic::fqmc::Sampler<S> > & sampler,
                                     const boost::shared_ptr<formic::CoeffObj<S> > & vf);

    void PrintNO_command_function(formic::Archive & arch, formic::AllData & data);

  }

}

#endif
